import {login, logout, getInfo} from '@/api/user';
import {getToken, setToken, removeToken} from '@/utils/auth';
import router, {resetRouter} from '@/router';

const state = {
  token: getToken (),
  name: '',
  avatar: '',
  introduction: '',
  roles: [],
};

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token;
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction;
  },
  SET_NAME: (state, name) => {
    state.name = name;
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar;
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles;
  },
};

const actions = {
  // 用户登录
  login ({commit}, userInfo) {
    const {username, password} = userInfo;
    return new Promise ((resolve, reject) => {
      let data = {
        grant_type: 'password',
        scope: 'FreeCare offline_access',
        client_id: 'FreeCare_PEIS',
        client_secret: undefined,
        username: username.trim (),
        password: password,
      };
      login (data)
        .then (response => {
          const {data} = response;
          commit ('SET_TOKEN', data.access_token);
          setToken (data.access_token, data.expires_in);
          resolve ();
        })
        .catch (error => {
          reject (error);
        });
    });
  },

  // 获取用户信息
  getInfo({commit, state}) {
    return new Promise((resolve, reject) => {
      getInfo().then(response => {
        const { data } = response
        if (!data) {
          reject('Verification failed, please Login again.')
        }

        const { roles, userName } = data.currentUser

        // 验证返回的roles是否是一个非空数组
        if (!roles || roles.length <= 0) {
          reject('getInfo: roles must be a non-null array!')
        }

        commit('SET_ROLES', roles)
        commit('SET_NAME', userName)
        commit('SET_AVATAR','https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif')
        // commit('SET_INTRODUCTION', introduction)
        resolve(data.currentUser)
      }).catch(error => {
        reject(error)
      })
    })
  },

  // 用户注销
  logout({commit, state, dispatch}) {
    return new Promise ((resolve, reject) => {
      logout (state.token)
        .then (() => {
          commit ('SET_TOKEN', '');
          commit ('SET_ROLES', []);
          removeToken ();
          resetRouter ();

          dispatch ('tagsView/delAllViews', null, {root: true});

          resolve ();
        })
        .catch (error => {
          reject (error);
        });
    });
  },

  // 删除 token
  resetToken({commit}) {
    return new Promise (resolve => {
      commit ('SET_TOKEN', '');
      commit ('SET_ROLES', []);
      removeToken ();
      resolve ();
    });
  },

  // dynamically modify permissions
  async changeRoles ({commit, dispatch}, role) {
    const token = role + '-token';

    commit ('SET_TOKEN', token);
    setToken (token, data.expires_in ?? 3600);

    const {roles} = await dispatch ('getInfo');

    resetRouter ();

    // generate accessible routes map based on roles
    const accessRoutes = await dispatch ('permission/generateRoutes', roles, {
      root: true,
    });
    // dynamically add accessible routes
    router.addRoutes (accessRoutes);

    // reset visited views and cached views
    dispatch ('tagsView/delAllViews', null, {root: true});
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
